package userfunctions;

import java.util.Vector;
import userfunctions.packets.PacketResponse;
import userfunctions.packets.*;
import userfunctions.packets.client.PacketVector;

/**
 * Podstawowa klasa zalogowanego użytkownika systemu.
 * @author Kamil Woźnicki
 */
public class Person {
    /**
     * Id uzytkownika.
     */
    protected String userId;
    /**
     * Ostatni blad.
     */
    protected String error = "";
    
    /**
     * Metoda pobiera ostatni blad zwrocony przez serwer.
     * @return Ciag znakow zawierajacy opis bledu.
     */
    public String getLastError() {
        return error;
    }
    
    /**
     * Metoda ustawia ostatni błąd.
     * @param errorMsg Nowy ciag znakow okreslajacy blad.
     */
    protected void setLastError(String errorMsg) {
        error = errorMsg;
    }
    
    /**
     * Metoda ustawia id usera.
     * @param userId Nowy identyfikator uzytkownika.
     */
    public void setUserId(String userId) {
        this.userId = userId;
    }
    
    /**
     * Metoda wysyla dane do serwera za pomoca NetworkManager.
     * @param packet Pakiet ktora zostanie zserializowany.
     */
    protected void sendPacket(Packet packet) {
        NetworkManager manager = NetworkManager.getInstance();

        packet.setUserId(userId);
        
        manager.sendPacket(packet);
    }
    
    /**
     * Metoda pobiera pakiet przyslany z serwera.
     * @return Pakiet będacy reprezentacja wyslanej przez serwer odpowiedzi.
     */
    protected Packet recvPacket() {
        IPacket packet = NetworkManager.getInstance().receivePacket();
        
        if (packet instanceof Packet) {
            return (Packet)packet;
        } else {
            return null;
        }
    }
    
    /**
     * Metoda parsujaca pakiet odpowiedzi do odpowiedniej postaci.
     * @return Metoda zwraca wartosc logiczna okreslajac poprawnosc ostatniej operacji.
     * Ponad to, jezeli wystapil blad, ustawia nowa wartosc opisu bledu.
     */
    protected boolean handleResponse() {
        Packet response = recvPacket();
        
        if (response instanceof PacketResponse) {
            PacketResponse packet = (PacketResponse)response;
            
            if (packet.status == 0) {
                return true;
            } else {
                error = packet.message;
            }
            
        } else {
            error = "Server error!";
        }
        
        return false;
    }
    
    /**
     * Metoda przeksztalaca zwrocona przez serwer tablice do vectora.
     * @return Vector zawierajacy dane.
     */
    protected Vector<String> handleVector() {
        Packet resp = recvPacket();
        
        if (resp instanceof PacketVector) {
            PacketVector vec = (PacketVector)resp;
            
            return vec.data;
        } else {
            return null;
        }
    }
}
